home *** CD-ROM | disk | FTP | other *** search
/ MIDICraft's MIDINET CD-ROM / MIDICraft's MIDINET CD-ROM.iso / DOSUTILS / KORG / FINDI3.CPP < prev    next >
C/C++ Source or Header  |  1996-11-03  |  7KB  |  306 lines

  1. // findi3: (c) by Günter Nagler 1996
  2. #include <stdio.h>
  3. #include <conio.h>
  4. #include <string.h>
  5. #include <ctype.h>
  6. #include "korg.hpp"
  7. #include <dir.h>
  8. #include "like.h"
  9. #include <stdlib.h>
  10.  
  11. enum KORGFILE { other, sty, arr, pcg, bsq, sng };
  12.  
  13. int pause = 0;
  14. int linecount = 0;
  15.  
  16. char* defaultmask = "*";
  17.  
  18. int usage()
  19. {
  20.    printf("findi3 searches names in korg files\n");
  21.    printf("usage: findi3 [-h] [-p] [-m filemask] name ...\n");
  22.    printf("-h or -?\t\tshow this usage information\n");
  23.    printf("-p\t\tpause screen after each page\n");
  24.    printf("-m filemask\tsearch only in files matching filemask (default: *.*)\n");
  25.    printf("name can contain wildcards (*,?)\n");
  26.    return 1;
  27. }
  28.  
  29.  
  30. char namebuf[4000];
  31.  
  32. long namecount = 0;
  33. int filecount = 0;
  34.  
  35. void stop()
  36. {
  37.   fprintf(stderr, "program aborted by <esc>\n");
  38.   exit(1);
  39. }
  40.  
  41. void found(KORGFILE type, char* filename, int idx, char* s, int len)
  42. {
  43.   if (namecount == 0)
  44.   {
  45.     printf("%-10.10s\tLoc\tFilename\n", "Name");
  46.     printf("%-10.10s\t---\t--------\n", "--------");
  47.     linecount += 2;
  48.   }
  49.   namecount++;
  50.   linecount++;
  51.   printf("%-10.10s\t", s);
  52.   switch(type)
  53.   {
  54.   case pcg:
  55.     if (idx < 64)
  56.       printf("D%d%d", (idx / 8)+1, (idx %8)+1);
  57.     else
  58.       printf("Dr%d", idx - 64 + 7);
  59.     break;
  60.   case arr:
  61.       printf("A%d%d", (idx / 8)+1, (idx %8)+1);
  62.     break;
  63.   case sty:
  64.       printf("U%d", idx +1);
  65.     break;
  66.   case bsq:
  67.       printf("BSQ%d", idx);
  68.     break;
  69.   case sng:
  70.       printf("S%d", idx);
  71.     break;
  72.   default:
  73.     printf("%d", idx);
  74.     break;
  75.   }
  76.   printf("\t%s\n", filename);
  77.   if (pause && linecount >= 24)
  78.   {
  79.     fprintf(stderr,"-- press any key to continue or <esc> to stop --");
  80.     linecount = 0;
  81.     int c = getch();
  82.     if (c == 0)
  83.       c = getch();
  84.     fprintf(stderr, "\n");
  85.     if (c == 27)
  86.       stop();
  87.   }
  88.   else if (kbhit() && getch() == 27)
  89.     stop();
  90. }
  91.  
  92. int findi3(KORGFILE type, char* filename, char* namebuf, int namebuflen, int namelen, int argc, char** argv)
  93. {
  94. int ret = 0;
  95. char pattern[256];
  96.  
  97.   for (int arg = 0;  arg < argc; arg++)
  98.   if (argv[arg])
  99.   {
  100.     strcpy(pattern, argv[arg]);
  101.     int patternlen = strlen(pattern);
  102.     if (patternlen == 0)
  103.       continue;
  104.     strcat(pattern, "*");        // prefix search
  105.     patternlen++;
  106.     for (int i = 0, idx = 0; i < namebuflen; i+= namelen, idx++)
  107.     {
  108.       int len = namelen;
  109.       while (len > 0 && namebuf[i+len-1] == ' ')
  110.     len--;
  111.       if (len > 0 && like(namebuf+i, len, pattern, patternlen))
  112.       {
  113.     found(type, filename, idx, namebuf+i, len);
  114.     ret = 1;
  115.       }
  116.     }
  117.   }
  118.   return ret;
  119. }
  120.  
  121. int findi3(KORGFILE type, char* filename, FILE* f, int argc, char** argv)
  122. {
  123. block names;
  124. int namebuflen, i, idx;
  125.  
  126.   if (!f)
  127.     return 0;
  128.  
  129.   int namelen = 10;
  130.   switch(type)
  131.   {
  132.   case pcg:
  133.     fseek(f, 0x18, SEEK_SET);
  134.     if (fread(&names, sizeof(names), 1, f) != 1)
  135.       return 0;
  136.     break;
  137.   case arr:
  138.   case sty:
  139.     fseek(f, 0x10, SEEK_SET);
  140.     if (fread(&names, sizeof(names), 1, f) != 1)
  141.       return 0;
  142.     break;
  143.   case bsq:
  144.     fseek(f, 0x10, SEEK_SET);
  145.     if (fread(namebuf, 2292, 1, f) != 1)
  146.       return 0;
  147.     namebuflen = 0;
  148.     for (i = 0, idx = 0; idx < 10; i+= 0xc3, idx++)
  149.     {
  150.       if (i != namebuflen)
  151.     strncpy(namebuf+namebuflen, namebuf+i, namelen);
  152.       namebuflen += namelen;
  153.     }
  154.     return findi3(type, filename, namebuf, namebuflen, namelen, argc, argv);
  155.   case sng:
  156.     fseek(f, 0x10, SEEK_SET);
  157.     if (fread(namebuf, 2960, 1, f) != 1)
  158.       return 0;
  159.     namebuflen = 0;
  160.     for (i = 0x35, idx = 0; idx < 10; i+= 0x128, idx++)
  161.     {
  162.       if (i != namebuflen)
  163.     strncpy(namebuf+namebuflen, namebuf+i, namelen);
  164.       namebuflen += namelen;
  165.     }
  166.     return findi3(type, filename, namebuf, namebuflen, namelen, argc, argv);
  167.   default:
  168.     return 0;
  169.   }
  170.   fseek(f, names.adr, SEEK_SET);
  171.   if (ftell(f) != names.adr || names.len <= 0)
  172.     return 0;
  173.   if ((names.len % namelen) != 0)
  174.     return 0;
  175.   if (names.len > sizeof(namebuf))
  176.     return 0;
  177.   if  (fread(namebuf, namebuflen=(int)names.len, 1, f) != 1)
  178.     return 0;
  179.   return findi3(type, filename, namebuf, namebuflen, namelen, argc, argv);
  180. }
  181.  
  182. int findi3(char* filemask, int argc, char** argv)
  183. {
  184. struct ffblk ff;
  185. int ret = 0;
  186. FILE* f = 0;
  187. KORGFILE type;
  188. static char path[128];
  189. char* filename;
  190.  
  191.    strcpy(path, filemask);
  192.    filename = strrchr(path, '\\');
  193.    if (filename)
  194.      filename++;
  195.    else
  196.    {
  197.      filename = strchr(path, ':');
  198.      if (filename)
  199.        filename++;
  200.      else
  201.        filename = path;
  202.    }
  203.    int done = findfirst(path, &ff, 0);
  204.    while (!done)
  205.    {
  206.      char* ext = strrchr(ff.ff_name, '.');
  207.      if (!ext)
  208.     type = other;
  209.      else
  210.      {
  211.        ext++;
  212.        if (stricmp(ext, "PCG") == 0)
  213.      type = pcg;
  214.        else if (stricmp(ext, "STY") == 0)
  215.      type = sty;
  216.        else if (stricmp(ext, "ARR") == 0)
  217.      type = arr;
  218.        else if (stricmp(ext, "BSQ") == 0)
  219.      type = bsq;
  220.        else if (stricmp(ext, "SNG") == 0)
  221.      type = sng;
  222.        else
  223.      type = other;
  224.      }
  225.  
  226.      if (type == other)
  227.        f = 0;
  228.      else if (type == bsq && ff.ff_fsize <= 2308)
  229.      {
  230.        filecount++;
  231.        f = 0; // empty bsq
  232.      }
  233.      else if (type == sng && ff.ff_fsize <= 3718)
  234.      {
  235.        filecount++;
  236.        f = 0; // empty sng
  237.      }
  238.      else
  239.      {
  240.        strcpy(filename, ff.ff_name);
  241.        f = fopen(path, "rb");
  242.      }
  243.      if (f)
  244.      {
  245.        char id[5];
  246.  
  247.        if (fread(id, sizeof(id), 1, f) == 1 && strncmp(id, "KORG9", 5) == 0)
  248.        {
  249.      filecount++;
  250.  
  251.      int r = findi3(type, path, f, argc, argv);
  252.      if (r)
  253.        ret = 1;
  254.        }
  255.        fclose(f);
  256.      }
  257.      done = findnext(&ff);
  258.    }
  259.    return ret;
  260. }
  261.  
  262. int main(int argc, char** argv)
  263. {
  264. char* filemask = "*.*";
  265.  
  266.   argc--; argv++;
  267.  
  268.   while (argc > 0 && (**argv == '-' || **argv == '/'))
  269.   {
  270.     char* option = (*argv)+1;
  271.     if (strnicmp(option, "help", 1) == 0 || strcmp(option,"?") == 0)
  272.     {
  273.       usage();
  274.       return 1;
  275.     }
  276.     if (strnicmp(option, "mask", 1) == 0 || strnicmp(option, "file", 1) == 0)
  277.     {
  278.       argc--; argv++;
  279.       if (argc == 0)
  280.     fprintf(stderr, "option -m needs a filemask parameter (default: *.*)\n");
  281.       else
  282.       {
  283.     filemask = *argv++; argc--;
  284.       }
  285.       continue;
  286.     }
  287.     if (strnicmp(option, "pause", 1) == 0)
  288.     {
  289.       pause = 1;
  290.       argc--; argv++; continue;
  291.     }
  292.     fprintf(stderr, "invalid option %s\n", *argv);
  293.     argc--; argv++;
  294.   }
  295.  
  296.   if (argc == 0)
  297.     findi3(filemask, 1, &defaultmask);
  298.   else
  299.     findi3(filemask, argc, argv);
  300.   if (filecount == 0)
  301.     printf("No KORG files found\n");
  302.   else if (namecount == 0)
  303.     printf("No matching names found\n");
  304.   return 0;
  305. }
  306.